package com.gjy.scala.ex

/**
 * 赌数游戏
 *
 * 提供三个1-6的随机数，作为掷骰子得到的点数。（赋值） （庄家）
 *
 * 如果各个点数相同，则为豹子。（判断）
 * 如果三个骰子点数和，小于或等于9，则为“小”。
 * 如果三个骰子点数和，大于9，则为“大”。
 *
 * 用户随机选择：押大、押小或者押豹子。（玩家）
 * 通过判断，输出玩家是否押正确，并输出当前三位数字的值。
 * 如果正确三次，结束游戏。（循环）while\for\do-while
 *
 * 提示：
 * 随机数可以采用 (int) (Math.random() * 6 + 1); 产生，math.random()本身返回0～1d的double类型数值，
 * 使用强转转成int类型。
 * 获取用户输入可以采用Scanner input = new Scanner(System.in);
 * 每次需要获取用户输入时，直接使用 String guess = input.next();
 * Scanner使用前需要import java.util.Scanner;
 */


object ThrowTheDice {

  private def roll(): Int = (Math.random() * 6 + 1).toInt

  private def rollDice(): Dice = Dice(roll(), roll(), roll())

  private case class Dice(roll1: Int, roll2: Int, roll3: Int)

  private def judge(guess: String, dice: Dice): Boolean = {
    guess match {
      case "豹子" => isLeopard(dice)
      case "小" => isSmall(dice)
      case "大" => isBig(dice)
      case _ => false
    }
  }

  private def isLeopard(dice: Dice): Boolean = {
    dice.roll1 == dice.roll2 && dice.roll2 == dice.roll3
  }

  private def isSmall(dice: Dice): Boolean = {
    dice.roll1 + dice.roll2 + dice.roll2 <= 9
  }

  private def isBig(dice: Dice): Boolean = {
    dice.roll1 + dice.roll2 + dice.roll3 > 9
  }

  private def play(): Unit = {
    var cnt = 0
    println("欢迎来到赌数游戏！")
    println("请选择：押大、押小或者押豹子")
    while (cnt < 3) {
      val choice = scala.io.StdIn.readLine()

      val diceResult = rollDice()

      println(s"骰子结果为：${diceResult.roll1},${diceResult.roll2},${diceResult.roll3}")

      if (judge(choice, diceResult)) {
        println(s"恭喜你，押中了$choice")
        cnt += 1
      } else {
        println("很遗憾，你没有押中。")
      }
    }
    println("恭喜你，压中三次，游戏结束。")
  }

  def main(args: Array[String]): Unit = {
    play()
  }
}
